From d6afcee1e4fd48fdeb6ccec63ac2287091c863d7 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 26 Apr 2023 06:16:37 +0200 Subject: [PATCH] wgl: Create context during WGL initialization This way, we can realize it and either print success information about it or return NULL if that fails. This makes it more likely that we fail early, which means we can then initialize EGL. --- gdk/win32/gdkdisplay-win32.c | 10 +++--- gdk/win32/gdkglcontext-win32-wgl.c | 57 ++++++++++++++++++------------ gdk/win32/gdkglcontext-win32.h | 8 ++--- 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/gdk/win32/gdkdisplay-win32.c b/gdk/win32/gdkdisplay-win32.c index bad1076866..7952089f52 100644 --- a/gdk/win32/gdkdisplay-win32.c +++ b/gdk/win32/gdkdisplay-win32.c @@ -1182,6 +1182,7 @@ gdk_win32_display_init_gl (GdkDisplay *display, { GdkWin32Display *display_win32 = GDK_WIN32_DISPLAY (display); HDC init_gl_hdc = NULL; + GdkGLContext *context; if (display_win32->dummy_context_wgl.hdc == NULL) display_win32->dummy_context_wgl.hdc = GetDC (display_win32->hwnd); @@ -1216,12 +1217,9 @@ gdk_win32_display_init_gl (GdkDisplay *display, } #endif - if (gdk_win32_display_init_wgl (display, error)) - { - return g_object_new (GDK_TYPE_WIN32_GL_CONTEXT_WGL, - "display", display, - NULL); - } + context = gdk_win32_display_init_wgl (display, error); + if (context) + return context; #ifdef HAVE_EGL g_clear_error (error); diff --git a/gdk/win32/gdkglcontext-win32-wgl.c b/gdk/win32/gdkglcontext-win32-wgl.c index 31dedf4922..b4b80dd065 100644 --- a/gdk/win32/gdkglcontext-win32-wgl.c +++ b/gdk/win32/gdkglcontext-win32-wgl.c @@ -247,17 +247,17 @@ gdk_init_dummy_wgl_context (GdkWin32Display *display_win32) return best_idx; } -gboolean +GdkGLContext * gdk_win32_display_init_wgl (GdkDisplay *display, GError **error) { int best_idx = 0; GdkWin32Display *display_win32 = GDK_WIN32_DISPLAY (display); - GdkGLVersion gl_version; + GdkGLContext *context; HDC hdc; if (!gdk_gl_backend_can_be_used (GDK_GL_WGL, error)) - return FALSE; + return NULL; /* acquire and cache dummy Window (HWND & HDC) and * dummy GL Context, it is used to query functions @@ -276,7 +276,7 @@ gdk_win32_display_init_wgl (GdkDisplay *display, GDK_GL_ERROR_NOT_AVAILABLE, _("No GL implementation is available")); - return FALSE; + return NULL; } display_win32->hasWglARBCreateContext = @@ -290,29 +290,40 @@ gdk_win32_display_init_wgl (GdkDisplay *display, display_win32->hasWglARBmultisample = epoxy_has_wgl_extension (hdc, "WGL_ARB_multisample"); - gdk_gl_version_init_epoxy (&gl_version); + context = g_object_new (GDK_TYPE_WIN32_GL_CONTEXT_WGL, + "display", display, + NULL); + if (!gdk_gl_context_realize (context, error)) + { + g_object_unref (context); + return NULL; + } - GDK_NOTE (OPENGL, - g_print ("WGL API version %d.%d found\n" - " - Vendor: %s\n" - " - Checked extensions:\n" - "\t* WGL_ARB_pixel_format: %s\n" - "\t* WGL_ARB_create_context: %s\n" - "\t* WGL_EXT_swap_control: %s\n" - "\t* WGL_OML_sync_control: %s\n" - "\t* WGL_ARB_multisample: %s\n", - gdk_gl_version_get_major (&gl_version), - gdk_gl_version_get_minor (&gl_version), - glGetString (GL_VENDOR), - display_win32->hasWglARBPixelFormat ? "yes" : "no", - display_win32->hasWglARBCreateContext ? "yes" : "no", - display_win32->hasWglEXTSwapControl ? "yes" : "no", - display_win32->hasWglOMLSyncControl ? "yes" : "no", - display_win32->hasWglARBmultisample ? "yes" : "no")); +#if G_ENABLE_DEBUG + { + int major, minor; + gdk_gl_context_get_version (context, &major, &minor); + GDK_NOTE (OPENGL, g_print ("WGL API version %d.%d found\n" + " - Vendor: %s\n" + " - Checked extensions:\n" + "\t* WGL_ARB_pixel_format: %s\n" + "\t* WGL_ARB_create_context: %s\n" + "\t* WGL_EXT_swap_control: %s\n" + "\t* WGL_OML_sync_control: %s\n" + "\t* WGL_ARB_multisample: %s\n", + major, minor, + glGetString (GL_VENDOR), + display_win32->hasWglARBPixelFormat ? "yes" : "no", + display_win32->hasWglARBCreateContext ? "yes" : "no", + display_win32->hasWglEXTSwapControl ? "yes" : "no", + display_win32->hasWglOMLSyncControl ? "yes" : "no", + display_win32->hasWglARBmultisample ? "yes" : "no")); + } +#endif wglMakeCurrent (NULL, NULL); - return TRUE; + return context; } /* Setup the legacy context after creating it */ diff --git a/gdk/win32/gdkglcontext-win32.h b/gdk/win32/gdkglcontext-win32.h index 8311f47768..c3c8c1a8d5 100644 --- a/gdk/win32/gdkglcontext-win32.h +++ b/gdk/win32/gdkglcontext-win32.h @@ -64,10 +64,10 @@ struct _GdkWin32GLContextClass typedef struct _GdkWin32GLContextWGL GdkWin32GLContextWGL; -gboolean gdk_win32_display_init_wgl (GdkDisplay *display, - GError **error); -void gdk_win32_gl_context_wgl_bind_surface (GdkWin32GLContextWGL *ctx, - GdkWin32Surface *win32_surface); +GdkGLContext * gdk_win32_display_init_wgl (GdkDisplay *display, + GError **error); +void gdk_win32_gl_context_wgl_bind_surface (GdkWin32GLContextWGL *ctx, + GdkWin32Surface *win32_surface); GType gdk_win32_gl_context_wgl_get_type (void) G_GNUC_CONST; -- 2.30.2